package kr.pe.johnkim.sendme.activity;

import java.io.File;
import java.util.ArrayList;

import org.json.JSONArray;
import org.json.JSONObject;

import kr.pe.johnkim.sendme.provider.SendMeFriend;
import kr.pe.johnkim.sendme.provider.SendMeLog;
import kr.pe.johnkim.sendme.provider.SendMeTempMessageAdapter;
import kr.pe.johnkim.sendme.provider.SendMeTempMessageGroupEditAdapter;
import kr.pe.johnkim.sendme.provider.SendMeVoice;
import kr.pe.johnkim.sendme.rest.SendMeAudioMessageRest;
import kr.pe.johnkim.sendme.rest.SendMeLogRest;
import kr.pe.johnkim.sendme.util.SendMeActivityManager;
import kr.pe.johnkim.sendme.util.SendMeCommon;
import kr.pe.johnkim.sendme.util.SendMeConstant;
import kr.pe.johnkim.sendme.util.SendMeDBManagerAudioRecord;
import kr.pe.johnkim.sendme.util.SwipeListViewActivity;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Gravity;
import android.view.Menu;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.AbsListView;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.Toast;
import android.widget.AbsListView.OnScrollListener;
/**
 * SendMeTempMessageListActivity - 임시 보관함
 *  녹음된 메시지를 보내지 않고 임시 보관하면 sqlite 에 저장된다.
 *  저장해둔 임시 보관 메시지들을 조회하고 듣기,전송, 리스트 편집 기능을 수행하는 액티비티 클래스이다.
 * @author blue
 *
 */
public class SendMeTempMessageListActivity extends SwipeListViewActivity implements OnScrollListener {
	
	public static String TAG = SendMeTempMessageListActivity.class.getSimpleName();
	
	// 액티비티 매니저를 가져 온다.
	private SendMeActivityManager sendMeActivityManager = SendMeActivityManager.getInstance();
	
	// 마스터 암호.
	private String MASTER_PASSWORD = "";
		
	// 퍼블릭 암호.
	private String PUBLIC_PASSWORD = "";
		
	// 기능 모드.(MASTER/PUBLIC)
	private String FUNCTION_MODE = "";
		
	// 사용자 휴대 전화번호.
	private String PHONE_NUMBER = "";
	
	ImageButton imageButtonTopBack;
	ImageButton imageButtonTopMainMenu;
	
//	// 리스트에서 클릭한 버튼이 위치한 포지션
//	int selectedPosition;
	// 리스트에서 클릭한 항목
	SendMeVoice selectedItem;
	
	// 파일명 포함하는 파일 경로		
	String filePath;
	// sqlite 에서 삭제할때 사용할 인덱스
	String sqliteKey;
	
	// 임시 메시지 리스트를 뿌려줄 뷰
	ListView listViewTempMessage;
	
	// 그룹원 리스트를 뿌려줄 뷰
	ListView listViewTempMessageGroupEdit;		 

	// 보여주기 레이아웃. 메시지 리스트 / 그룹원 리스트
	View listViewTempMessageGroupEditLayout;
	// 그룹원 체크하고나서 삭제할때 버튼
	Button groupEditDeleteBtn;
	public boolean groupEditMode = false;
	
	// 선택된 포지션
	public int selectedPosition; 
	
	
	// 임시 저장 음성 메시지 어댑터 클래스.
	private SendMeTempMessageAdapter tempMessageAdapter;		
	
	// sqlite 에 저장되어 있는 임시 메시지 목록
	private ArrayList<SendMeVoice> tempMessageList = null;
	public ArrayList<SendMeVoice> tempMessageListFiltered = null;
	
	// 리스트 없음 표시
	View emptyListView;
	
	// 그룹원 편집기능.
	// 그룹원 어댑터 클래스.
	private SendMeTempMessageGroupEditAdapter tempMessageGroupEditAdapter;
	// 그룹원 목록
	private ArrayList<SendMeFriend> groupEditFriendList = null;

	
	// 프로그래스바(로딩 표시)
	private ProgressDialog dialog;
	
	
	
	// 로그를 남긴다
	private static final int THREAD_REGISTER_LOG = 100;
	
	// 앱을 종료 한다.
	private static final int ALERT_DIALOG_EXIT_ID = 101;
	
	// sqlite 에 저장된 임시 메시지 목록을 조회한다
	private static final int THREAD_SELECT_TEMP_MESSAGE_LIST = 102;		
	
	// 조회한 리스트를 화면에 세팅한다
	private static final int THREAD_SHOW_TEMP_MESSAGE_LIST = 103;
	
	// 조회한 그룹원 리스트를 화면에 세팅한다.
	private static final int THREAD_SHOW_TEMP_MESSAGE_GROUP_EDIT_LIST = 133;		
	
	// 프로그레스 바를 출력 한다.
	private static final int THREAD_PROGRESS_BAR_VISIBLE = 105;
		
	// 프로그레스 바를 감춘다.
	private static final int THREAD_PROGRESS_BAR_INVISIBLE = 106;
	
	// 음성 메시지 전송전 확인 창을 띄운다				
	private static final int THREAD_CONFIRM_SEND_AUDIO = 114;	
	
	// 등록 성공 토스트를 띄운다
	private static final int THREAD_TOAST_SEND_SUCCESS = 110;
		
	// 등록 실패 토스트를 띄운다
	private static final int THREAD_TOAST_SEND_FAIL = 112;		
	
	// 임시 삭제 성공 토스트를 띄운다
	private static final int THREAD_TOAST_TEMP_DELETE_SUCCESS = 116;	
	// 임시 삭제 실패 토스트를 띄운다
	private static final int THREAD_TOAST_TEMP_DELETE_FAIL = 118;		
		
	
	// 삭제 전 확인 창을 띄운다
	private static final int THREAD_CONFIRM_DELETE = 126;	
		
	// 그룹원 전체 삭제불가 알림창을 띄운다	
	private static final int  THREAD_CAN_NOT_DELETE_GROUP_ALL = 127;

	
	
	
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		Log.d(TAG,"onCreate");
		
		// 커스텀 타이블 바를 설정 한다.
		Window window = getWindow();
		window.requestFeature(Window.FEATURE_CUSTOM_TITLE);
				
		setContentView(R.layout.activity_send_me_temp_message_list);
		
		window.setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title_bar_03);
		
		// 액티비티 매니저에 담는다.
		sendMeActivityManager.addActivity(this);
				
		// 설정파일을 가져 온다.
		this.confirmNotification();

		
		// 메시지 리스트 레이아웃 , 그룹원 리스트 레이아웃
		listViewTempMessageGroupEditLayout = findViewById(R.id.list_view_temp_message_group_edit_layout);
		
		listViewTempMessage = (ListView) findViewById(R.id.list_view_temp_message);
		listViewTempMessageGroupEdit  = (ListView) findViewById(R.id.list_view_temp_message_group_edit);
		
		
		// 뒤로 가기 화살표 버튼을 설정 한다.
		imageButtonTopBack = (ImageButton)findViewById(R.id.imageButtonTopBack);
		imageButtonTopBack.setOnClickListener(new View.OnClickListener() {
					
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
						
				// 화면을 닫는다.
				sendMeActivityManager.removeActivity(SendMeTempMessageListActivity.this);
				finish();
			}
		});
		
		// 타이틀바의 메인 메뉴 버튼을 설정 한다.
		imageButtonTopMainMenu = (ImageButton)findViewById(R.id.imageButtonTopMainMenu);
		imageButtonTopMainMenu.setOnClickListener(new OnClickListener() {
					
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Log.i(TAG, "pressed top main menu.");
						
				// 메인 메뉴 화면을 출력 한다.
				Intent i = new Intent(SendMeTempMessageListActivity.this, SendMeMainMenuActivity.class);
				startActivity(i);
				
				// 화면을 닫는다.
				sendMeActivityManager.removeActivity(SendMeTempMessageListActivity.this);
				finish();
				
			}
		});
		
		// 그룹원 삭제 버튼을 설정한다
		groupEditDeleteBtn = (Button)findViewById(R.id.group_edit_delete_btn);
		groupEditDeleteBtn.setOnClickListener(new OnClickListener() {
					
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Log.i(TAG, "groupEditDeleteBtn onClick");
				
				
				boolean deleteAvailable = false;
				
				for(int i=0; i<groupEditFriendList.size(); i++){
					if(!(groupEditFriendList.get(i).getIsSelectedForSend())){	// 삭제모
						deleteAvailable = true;
					}
				}
				
				if(deleteAvailable){
					SendMeCommon sendMeCommon = new SendMeCommon();
					
					// 선택된 포지션에 있는 그룹원 정보. 형변환 용도
					String tempMessageListReceiversStr;   
					String tempMessageListReceiverNamesStr ;		 
					String[] tempMessageListReceiversArray ;		 
					String[] tempMessageListReceiverNamesArray ;		 
					ArrayList<String> stringReceiverArrayList = new ArrayList<String>();
					ArrayList<String> stringReceiverNameArrayList = new ArrayList<String>();
					
					
					// 삭제 하고 남은 목록으로 재구성한다
					// 그룹 편집하고 난 결과가 임시 저장될 리스트 생성
					ArrayList<SendMeFriend> tempGroupEditFriendList = new ArrayList<SendMeFriend>(); 
					
					// 삭제 체크되지 않은 목록들만 모은다.
					for(int i=0; i<groupEditFriendList.size(); i++){
						if(!(groupEditFriendList.get(i).getIsSelectedForSend())){		// 삭제 체크되지 않아 살아남은 정보들.
							tempGroupEditFriendList.add(groupEditFriendList.get(i));
							stringReceiverArrayList.add(groupEditFriendList.get(i).getPhoneNumber());		// arraylist 배열에 담는다
							stringReceiverNameArrayList.add(groupEditFriendList.get(i).getName());			// arraylist 배열에 담는다 // --> "그룹음성메시지" 로 되어있음;;
						}
					}
					groupEditFriendList = tempGroupEditFriendList;
					
					// 전번들
					tempMessageListReceiversArray = stringReceiverArrayList.toArray(new String[stringReceiverArrayList.size()]);		// String[] 을 변환한다
					tempMessageListReceiversStr = sendMeCommon.convertArrayToString(tempMessageListReceiversArray);			// String 으로 바꾼다
					// 이름들
					tempMessageListReceiverNamesArray = stringReceiverNameArrayList.toArray(new String[stringReceiverNameArrayList.size()]);	
					tempMessageListReceiverNamesStr = sendMeCommon.convertArrayToString(tempMessageListReceiverNamesArray);
					
					// 원본에 갱신한다 	. 파싱처리되기전 '/' 로 연결된 상태 그대로 저장된다
					tempMessageList.get(selectedPosition).setReceiver(tempMessageListReceiversStr);							// 새로운 값으로 저장한다
					tempMessageList.get(selectedPosition).setReceiverName(tempMessageListReceiverNamesStr);							// 새로운 값으로 저장한다
					tempMessageList.get(selectedPosition).setReceiverCount(tempMessageListReceiversArray.length+"");		// 변경된 개수도 저장

					SendMeVoice theTempMessage = tempMessageList.get(selectedPosition);
					String theSqlKey = theTempMessage.getSqliteKey();
					
					// 필터링에도 적용 ### 
					for(int i=0; i<tempMessageListFiltered.size(); i++){
						SendMeVoice theFilteredTempMessage = tempMessageListFiltered.get(i);
						if((theFilteredTempMessage.getSqliteKey()).equals(theSqlKey)){
							tempMessageListFiltered.get(i).setReceiver(tempMessageListReceiversStr);
							tempMessageListFiltered.get(i).setReceiverName(tempMessageListReceiverNamesStr);
							tempMessageListFiltered.get(i).setReceiverCount(tempMessageListReceiversArray.length+"");
						}
					}
//					tempMessageListFiltered = tempMessageList;		
					
					
					listViewTempMessageGroupEditLayout.setVisibility(View.GONE);
					groupEditMode = false;
					
					/*
					 *  sqlite 에 업데이트
					 */
					SendMeDBManagerAudioRecord sendMeDBManagerAudioRecord = new SendMeDBManagerAudioRecord(returnThis());
					
					boolean sqlResult = sendMeDBManagerAudioRecord.updateTempAudioData(tempMessageList.get(selectedPosition));
					if(sqlResult){
						Log.d(TAG,"SUCCESS update");
					}
					
					tempMessageAdapter.notifyDataSetChanged();
					
					deleteAvailable = false;
					
				}else{
					
					for(int i=0; i<groupEditFriendList.size(); i++){
						groupEditFriendList.get(i).setSelectedForSend(false);	
					}
					tempMessageGroupEditAdapter.notifyDataSetChanged();
					
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_CAN_NOT_DELETE_GROUP_ALL));
				}
			}
		});
		
		
		// 화면 출력을 위한 친구 목록을 생성 한다.
		tempMessageList = new ArrayList<SendMeVoice>();
		
		// 친구 어댑터를 생성 한다.
		tempMessageAdapter = new SendMeTempMessageAdapter(getApplicationContext(), this, tempMessageList);
		tempMessageGroupEditAdapter = new SendMeTempMessageGroupEditAdapter(getApplicationContext(), groupEditFriendList);
		// 리스트 없음 표시
		emptyListView = findViewById(R.id.emptyListView);
		
		// list view 의 cursor 를 제공하기 위해서 어댑터를 세팅 한다.
		tempMessageListFiltered = tempMessageList;		// 미리 복사
		getListView().setAdapter(tempMessageAdapter);
		
		// 스크롤 이벤트 리스너를 등록 한다.
		getListView().setOnScrollListener(this);
		
		// list 레이아웃 그리기 캐쉬를 설정 한다.
		getListView().setAlwaysDrawnWithCacheEnabled (true);
		
		
		// 로깅.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_REGISTER_LOG));
		
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.send_me_friend, menu);
		return true;
	}
	
	/**
	 * 필요한 핸들러를 등록해서 사용한다.
	 */
	private Handler mHandler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			switch(msg.what) {
			
			// 로그를 남긴다
			case THREAD_REGISTER_LOG : 
				threadRegisterLog();
				break;
				
			case ALERT_DIALOG_EXIT_ID : 
				break;
				
			// 임시 메시지 목록을 세팅
			case THREAD_SELECT_TEMP_MESSAGE_LIST : 
				threadProcessTempMessageListForShow();
				break;
				
				// 임시 메시지 목록을 출력 한다.		
			case THREAD_SHOW_TEMP_MESSAGE_LIST : 
				runOnUiThread(showTempMessageList);
				break;

				// 임시 메시지 그룹원 목록을 출력 한다.		
			case THREAD_SHOW_TEMP_MESSAGE_GROUP_EDIT_LIST : 
				runOnUiThread(showTempMessageGroupEditList);
				break;					

				// (서버 통신) 프로그레스 바를 출력 한다.
			case THREAD_PROGRESS_BAR_VISIBLE : 
					dialog.show();
				break;
				
				// (서버 통신) 프로그레스 바를 감춘다.
			case THREAD_PROGRESS_BAR_INVISIBLE : 
				dialog.hide();
				break;
				
				// 음성 메시지 전송전 확인 창을 띄운다		
			case THREAD_CONFIRM_SEND_AUDIO : 
				runOnUiThread(confirmSendAudio);				
				break;
				
				// (서버 통신) 전송 성공 토스트를 띄운다	
			case THREAD_TOAST_SEND_SUCCESS : 
				showToastAudioSendSuccess();		
				break;	
				
				// (서버 통신) 전송 실패 토스트를 띄운다
			case THREAD_TOAST_SEND_FAIL :
				showToastAudioSendFail();
				break;	
				
				// 음성 메시지를 삭제 성공 토스트를 띄운다
			case THREAD_TOAST_TEMP_DELETE_SUCCESS :
				showToastAudioDeleteToTempSuccess();
				break;	
				
				// 음성 메시지를 삭제 실패 토스트를 띄운다
			case THREAD_TOAST_TEMP_DELETE_FAIL :
				showToastAudioDeleteToTempFail();
				break;	
				
				// 음성 메시지 삭제전 확인 창을 띄운다		
			case THREAD_CONFIRM_DELETE : 
				runOnUiThread(confirmDeleteAudio);				
				break;
				
				// 그룹원 전체 삭제불가 알림창을 띄운다	
			case THREAD_CAN_NOT_DELETE_GROUP_ALL : 
				runOnUiThread(confirmCanNotDeleteGroupAll);				
				break;
				
			}
		}
	};
	
	/**
	 * sqlite 에서 조회하여 리스트에 저장된 것을 조회
	 */
	public void threadProcessTempMessageListForShow() {

		Thread thread = new Thread(new Runnable() {

			public void run() {
				
				Log.d(TAG,"threadProcessTempMessageListForShow");
				
				/*
				 *  sqlite 에 저장된 목록
				 */
				SendMeDBManagerAudioRecord sendMeDBManagerAudioRecord = new SendMeDBManagerAudioRecord(returnThis());
				tempMessageList = sendMeDBManagerAudioRecord.selectAllTempAudioData();
				// 처음에는 숨김.
				for(int i=0; i<tempMessageList.size(); i++){
					tempMessageList.get(i).setShowDeleteBtnYn(false);
				}
				
				// 작업이 끝났다면 화면에 세팅하는 메소드를 호출
				Log.d(TAG,"produce list end. call show list method.");
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_SHOW_TEMP_MESSAGE_LIST));
			}
		});
		thread.start();
	}
	
	
	/**
	 * 목록을 세팅해서 출력 한다.
	 */
	private Runnable showTempMessageList = new Runnable() {
		
		@Override
		public void run() {
			// TODO Auto-generated method stub
			
			if(tempMessageList!=null){
				tempMessageAdapter = new SendMeTempMessageAdapter(returnThis(), SendMeTempMessageListActivity.this, tempMessageList);
				tempMessageListFiltered = tempMessageList;		// 미리 복사
				getListView().setAdapter(tempMessageAdapter);
			}
			
			if(tempMessageList.size()>0){
				emptyListView.setVisibility(View.GONE);
			}else{
				emptyListView.setVisibility(View.VISIBLE);
			}
			
			
		}
	};
	
	
	
	
	
	
	
	/**
	 * 그룹편집을 위해 터치시 그룹원 목록을 조회한다.
	 */
	public void processTempMessageGroupEditList(String sqlKey, int idx){

		SendMeCommon sendMeCommon = new SendMeCommon();

		// 그룹 터치시 해당 그룹에서 조회.
		groupEditFriendList = new ArrayList<SendMeFriend>();

		for(int i=0; i<tempMessageList.size(); i++){
			if((tempMessageList.get(i).getSqliteKey()).equals(sqlKey)){
				selectedPosition = i;		// 이게 진짜
			}
		}

		String receiversGroupStr = tempMessageList.get(selectedPosition).getReceiver();

		String[] receivers = sendMeCommon.convertStringToArray(receiversGroupStr);

		for(int i=0; i<receivers.length; i++){
			SendMeFriend sendMeFriend = new SendMeFriend();

			sendMeFriend.setSelectedForSend(false);						// 체크안되어 있음
			sendMeFriend.setPhoneNumber(receivers[i]);					// 전번 세팅
			sendMeFriend.setName(sendMeCommon.selectFriendNameByPhoneNumber(returnThis(), receivers[i]));	// 이름 세팅

			groupEditFriendList.add(sendMeFriend);
		}

		// 작업이 끝났다면 화면에 세팅하는 메소드를 호출
		Log.d(TAG,"produce group edit list end. call show group edit list method.");
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_SHOW_TEMP_MESSAGE_GROUP_EDIT_LIST));

	}
	
	/**
	 * 그룹원 목록을 세팅해서 출력 한다.
	 */
	private Runnable showTempMessageGroupEditList = new Runnable() {
		
		@Override
		public void run() {
			Log.d(TAG,"showTempMessageGroupEditList. groupEditFriendList:"+groupEditFriendList.size());
			if(groupEditFriendList!=null && groupEditFriendList.size()>0){
				tempMessageGroupEditAdapter = new SendMeTempMessageGroupEditAdapter(returnThis(), groupEditFriendList);
				listViewTempMessageGroupEdit.setAdapter(tempMessageGroupEditAdapter);
				
//				listViewTempMessageLayout.setVisibility(View.INVISIBLE);
				listViewTempMessageGroupEditLayout.setVisibility(View.VISIBLE);
				
			}
		}
	};
	
	
	
	
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 리스트 슬라이드 기능 관련 
	
	@Override
	public void onScroll(AbsListView view, int firstVisibleItem,
			int visibleItemCount, int totalItemCount) {
		// TODO Auto-generated method stub

	}

	@Override
	public void onScrollStateChanged(AbsListView view, int scrollState) {
		// TODO Auto-generated method stub

	}

	@Override
	public ListView getListView() {
		return listViewTempMessage;
	}

	@Override
	public void getSwipeItem(boolean isRight, int position) {
		// TODO Auto-generated method stub
//		 밀면 우측 숨겨진 버튼이 보이도록 하기.
		
////		// 여기서 원본 값을 바꾸니까 문제가 되는 거임.
//		Log.d(TAG,"tempMessageListFiltered.size():"+tempMessageListFiltered.size());
//		Log.d(TAG,"tempMessageListFiltered.get(position).getSqliteKey():"+tempMessageListFiltered.get(position).getSqliteKey());
		
		if(isRight){		// 오른쪽으로 밀면 숨김
			
			// 바꿀 포지션(원본)
			for(int i=0; i<tempMessageList.size(); i++){
				// 현재 필터링된 포지션. 같은걸 찾는다
				if(tempMessageList.get(i).getSqliteKey().equals(tempMessageListFiltered.get(position).getSqliteKey())){
					// 같은걸 찾아. 실제 위치값을 바꾼다..org.
					tempMessageList.get(i).setShowDeleteBtnYn(false);	// isShowDeleteBtnYn	setShowDeleteBtnYn						
				}
			}
		}else{				// 왼쪽으로 밀면 생김
			// 바꿀 포지션(원본)
			for(int i=0; i<tempMessageList.size(); i++){
				// 현재 필터링된 포지션. 같은걸 찾는다
				if(tempMessageList.get(i).getSqliteKey().equals(tempMessageListFiltered.get(position).getSqliteKey())){
					// 같은걸 찾아. 실제 위치값을 바꾼다..org.
					tempMessageList.get(i).setShowDeleteBtnYn(true);	// isShowDeleteBtnYn	setShowDeleteBtnYn						
				}
			}
//			tempMessageList.get(position).setShowDeleteBtnYn(true);
		}
		tempMessageAdapter.notifyDataSetChanged();
	}

	@Override
	public void onItemClickListener(ListAdapter adapter, int position) {
		// TODO Auto-generated method stub
	}
	
	
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 리스트에 있는 버튼 클릭시 호출되는 메소드
	
	// 재생 버튼 클릭시 파라미터를 세팅하여 임시 파일 전용 재생 액티비티를 실행시킨다 -- 직접 받아서 호출하도록...
	public void playAudioMessage(SendMeVoice sendMeVoice){
		Intent intent = new Intent(SendMeTempMessageListActivity.this, SendMeAudioPlayForTempMessageActivity.class);
//		SendMeVoice sendMeVoice = tempMessageList.get(position);
		intent.putExtra("sqliteKey", sendMeVoice.getSqliteKey());
		intent.putExtra("sender", PHONE_NUMBER);
		intent.putExtra("receiver", sendMeVoice.getReceiver());
		intent.putExtra("receiverName", sendMeVoice.getReceiverName());
		intent.putExtra("fileName", sendMeVoice.getFileName());
		intent.putExtra("filePath", sendMeVoice.getFilePath());
		startActivity(intent);
		
		// 화면을 닫는다.
		sendMeActivityManager.removeActivity(SendMeTempMessageListActivity.this);
		finish();
	}

	// 전송 버튼 클릭시 전송 확인을 받고 서버로 전송한다. (전송 이후 처리 포함)
	public void sendAudioMessage(SendMeVoice selectedItemParam){
		selectedItem = selectedItemParam;
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_CONFIRM_SEND_AUDIO));		// 확인 후 전송
	}
	
	// 삭제 버튼 클릭시 확인을 받고 목록에서 삭제(sqlite, 로컬 파일)
	public void confirmDelete(SendMeVoice selectedItemParam){
//		selectedPosition = position;				
		selectedItem = selectedItemParam;				
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_CONFIRM_DELETE));		// 확인 후 삭제
	}
	
	/**
	 * 임시 메시지 삭제
	 *   임시 메시지를 sqlite 와 로컬에서 삭제 
	 *    토스트 알림 있음
	 */
	public void deleteTempFileAndRefreshActivityWithToast(){
		
//		SendMeVoice sendMeVoice = tempMessageList.get(selectedPosition);
		SendMeVoice sendMeVoice = selectedItem;
		
		filePath = sendMeVoice.getFilePath();
		sqliteKey = sendMeVoice.getSqliteKey();
		
		// sqlite 에서 삭제
		SendMeDBManagerAudioRecord sendMeDBManagerAudioRecord = new SendMeDBManagerAudioRecord(this);
		if(sendMeDBManagerAudioRecord.deleteTempAudioData(sqliteKey)) {
			
			// 임시 파일이 있다면 지운다.
			checkAndDeleteTempFile();
			
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_TOAST_TEMP_DELETE_SUCCESS));
		} else {
			// 실패 알림 토스트
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_TOAST_TEMP_DELETE_FAIL));
		}
		
		// 화면을 갱신한다.	// sqlite 에서 리스트를 조회한다
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_SELECT_TEMP_MESSAGE_LIST));	
	}
	
	
	
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	
	// 확인 창
	/**
	 * 음성 메시지 전송전 확인 창을 띄운다
	 */
	private Runnable confirmSendAudio = new Runnable() {
		@Override
		public void run() {
			
//			SendMeVoice sendMeVoice = tempMessageList.get(selectedPosition);
			SendMeVoice sendMeVoice = selectedItem;
			SendMeCommon sendMeCommon = new SendMeCommon();
//			String[] receiverList = sendMeCommon.convertStringToArray(sendMeVoice.getReceiver());
			String[] receiverNameList = sendMeCommon.convertStringToArray(sendMeVoice.getReceiverName());
			
			String dialogReceiver = "";
			if(receiverNameList.length==1) {
				dialogReceiver = receiverNameList[0]+" 님";	// receiverList --> receiverNameList
			} else {
				dialogReceiver = "그룹";
			}
			
			new AlertDialog.Builder(SendMeTempMessageListActivity.this)
			.setTitle("전송 확인")
			.setMessage(dialogReceiver + "에게 음성 메시지를 전송하시겠습니까?")
			.setNegativeButton("취소", new DialogInterface.OnClickListener() {

				@Override
				public void onClick(DialogInterface dialog, int which) {

				}
			})
			.setPositiveButton("확인", new DialogInterface.OnClickListener() {
				
				@Override
				public void onClick(DialogInterface dialog, int which) {
					threadRegisterVoice();
				}
			}).show();
			
		}
	};
	/**
	 * 음성 메시지 삭제전 확인 창을 띄운다
	 */
	private Runnable confirmDeleteAudio = new Runnable() {
		@Override
		public void run() {
			// selectedPosition
			
			new AlertDialog.Builder(SendMeTempMessageListActivity.this)
			.setTitle("임시 저장 삭제 확인")
			.setMessage("임시 저장된 음성 메시지를 삭제하시겠습니까?")
			.setNegativeButton("취소", new DialogInterface.OnClickListener() {

				@Override
				public void onClick(DialogInterface dialog, int which) {

				}
			})
			.setPositiveButton("확인", new DialogInterface.OnClickListener() {
				
				@Override
				public void onClick(DialogInterface dialog, int which) {
					deleteTempFileAndRefreshActivityWithToast();
				}
			}).show();
			
		}
	};
	
	/**
	 * 그룹원 전체 삭제 불가 알림창을 띄운다
	 */
	private Runnable confirmCanNotDeleteGroupAll = new Runnable() {
		@Override
		public void run() {
			// selectedPosition
			
			new AlertDialog.Builder(SendMeTempMessageListActivity.this)
			.setTitle("그룹원 삭제")
			.setMessage("전송 받을 사람이 최소 한명은 있어야 합니다.")
			.setNegativeButton("", new DialogInterface.OnClickListener() {
				@Override
				public void onClick(DialogInterface dialog, int which) {
				}
			})
			.setPositiveButton("확인", new DialogInterface.OnClickListener() {
				@Override
				public void onClick(DialogInterface dialog, int which) {
				}
			}).show();
			
		}
	};
	
	// 토스트
		/**
		 * 음성 메시지 전송에 성공했다는 toast 를 띄운다.
		 */
		public void showToastAudioSendSuccess() {					
			CharSequence text = "메시지가 전송 되었습니다";
			Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
			toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
			toast.show();
		}
		/**
		 * 음성 메시지 전송에 실패했다는 toast 를 띄운다.
		 */
		public void showToastAudioSendFail() {
			CharSequence text = "메시지 전송에 실패하였습니다";
			Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
			toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
			toast.show();
		}
		
		/**
		 *  임시 저장 음성 메시지 삭제에 성공했다는 toast 를 띄운다.
		 */
		public void showToastAudioDeleteToTempSuccess() {
			CharSequence text = "임시 보관함에서 삭제되었습니다.";
			Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
			toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
			toast.show();
		}
		/**
		 * 임시 저장 음성 메시지 삭제에 실패했다는 toast 를 띄운다.
		 */
		public void showToastAudioDeleteToTempFail() {
			CharSequence text = "삭제에 실패하였습니다.";
			Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
			toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
			toast.show();
		}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 서버 통신

	/**
	 * 음성 메시지를 등록한다
	 *  일반 리스트를 서버로 전송할때는 서버에서 RequestBody 로 받아서 json을 자동으로 object 변환시켜주므로
	 *    jsonArray 에 jsonObject 를 담을때 toString() 처리하여 담아서 보내야 하지만 
	 *  multipart로 파일을 전송하는 경우에는 서버에서 RequestParam 으로 받는데 이때에는 json을 자동으로 object 변환하지 않기 때문에
	 *   jsonArray 에 jsonObject 를 담을때 jsonObject 그대로 넣어야 서버에서 받을때 넣은 json 형태 그대로 꺼내어진다. 
	 */
	public void threadRegisterVoice() {

		// 프로그레스 바를 출력 한다.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));

		Thread thread = new Thread(new Runnable() {

			public void run() {
				// TODO Auto-generated method stub

//				SendMeVoice sendMeVoice = tempMessageList.get(selectedPosition);
				SendMeVoice sendMeVoice = selectedItem;
				/* 저장된 값 setSqliteKey / setReceiver / setReceiverName / setFileName / setFilePath
				 */
				sqliteKey = sendMeVoice.getSqliteKey();
				
				SendMeCommon sendMeCommon = new SendMeCommon();
				String[] receiverList = sendMeCommon.convertStringToArray(sendMeVoice.getReceiver());
//				String[] receiverNameList = sendMeCommon.convertStringToArray(sendMeVoice.getReceiverName());
				
				// 받는 사람 리스트를 string 데이터로 변환
				JSONObject jsonObject = null;
				JSONArray jsonArray = new JSONArray();
				String receiverListStr = "";
				try{
					for(int i=0; i<receiverList.length; i++){
						// 방법 1
						jsonObject = new JSONObject();
						jsonObject.put("phoneNumber", receiverList[i]);
						//jsonArray.put(jsonObject.toString());			// 서버로 전송 실패하게 됨
						jsonArray.put(jsonObject);						
					}
					receiverListStr = jsonArray.toString();
					Log.d(TAG,"receiverListStr:"+receiverListStr);		
				}catch(Exception e){
					e.printStackTrace();
				}
				
				
				/* 저장된 값 setSqliteKey / setReceiver / setReceiverName / setFileName / setFilePath
				 */

				sendMeVoice.setIdSendMeVoice("");			// 테이블 아이디.(PK)	

				sendMeVoice.setSender(PHONE_NUMBER);		//	생성자. 보내는 멤버 휴대 전화 번호.	
				sendMeVoice.setReceiver(receiverListStr);		// 받는 멤버 휴대 전화 번호.		 

				sendMeVoice.setActivateYn("Y");				// 활성화 여부.	
				sendMeVoice.setModifyDate(sendMeCommon.getCurrentDate());				// 수정 일자.	
				sendMeVoice.setRegisterDate(sendMeCommon.getCurrentDate());				// 등록 일자.	

				sendMeVoice.setAvailableDay(SendMeConstant.AVAILABLE_DAY);			// 사용 가능 기간 일수. 기본값은 7	
				sendMeVoice.setReadYn("N");					// 읽음 여부. 기본값은 N			

				// 일반 전송
				sendMeVoice.setDeliveryYn("Y");				// 예약 발송일 경우  N				
				sendMeVoice.setReservationDate("");			// 예약 발송일 경우 날짜				
				sendMeVoice.setReservationTime("");			// 예약 발송일 경우 시각

//				sendMeVoice.setFileName(fileName);				// 파일 명.	

				// 음성 파일.
				filePath = sendMeVoice.getFilePath();
						
				File file = new File(filePath);
				if(file.exists()){
					try {
						sendMeVoice.setFile(file);
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
				//				sendMeVoice.setFileContentType("audio/mpeg");			// FileContentType for mp3

				SendMeAudioMessageRest sendMeAudioMessageRest = new SendMeAudioMessageRest();
				SendMeVoice result = new SendMeVoice();
//				result = sendMeAudioMessageRest.registerVoice(sendMeVoice);		// 원본 (정상 동작)
				result = sendMeAudioMessageRest.registerVoice2(sendMeVoice);	// 테스트용

				// 프로그레스 바를 감춘다.
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));

				// 인증번호 요청에 성공하면 toast 를 띄워서 알려준다. 
				if(("SUCCESS").equals(result.getResult())) {
					// 성공 알림 토스트
					// 일반 보내기
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_TOAST_SEND_SUCCESS));
					
					deleteTempFile();		// 로컬 파일 및 로컬 db에서 삭제.
					
					// 리스트 갱신
					// sqlite 에서 리스트를 조회한다
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_SELECT_TEMP_MESSAGE_LIST));	
					
//					// 종료 프로세스
//					deleteTempFileAndFinishActivity();
					
				}else{
					// 실패 알림 토스트
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_TOAST_SEND_FAIL));
				}
			}
		});
		thread.start();
	}
	
	/**
	 * 로그를 남긴다	 
	 */
	public void threadRegisterLog() {
		Thread thread = new Thread(new Runnable() {
			public void run() {
				
				SendMeCommon sendMeCommon = new SendMeCommon();
				String nowTime = sendMeCommon.getCurrentDate();
				
				SendMeLog sendMeLog = new SendMeLog();
				sendMeLog.setPhoneNumber(PHONE_NUMBER);
				sendMeLog.setViewName(TAG);
				sendMeLog.setRegisterDate(nowTime);
				
				SendMeLogRest sendMeLogRest = new SendMeLogRest();
				
				sendMeLogRest.registerLog(sendMeLog);
			}
		});
		thread.start();
	}
	
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	
	@Override
	protected void onResume(){
		super.onResume();
		
		dialog = ProgressDialog.show(SendMeTempMessageListActivity.this, "", "Send..", true);	// 제목, 내용
		dialog.hide();
		
		// sqlite 에서 리스트를 조회한다
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_SELECT_TEMP_MESSAGE_LIST));		// SELECT_TEMP_MESSAGE_LIST		SHOW_TEMP_MESSAGE_LIST
	}
	
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	
	
	// 컨텍스트 반환
		public Context returnThis() {
			return this;
		}
	
	/**
	 * SharedPreference 정보를 확인 한다.
	 */
	public void confirmNotification() {
		SharedPreferences mSharedPreference = getSharedPreferences(SendMeConstant.SENDME_PREFERENCE, Activity.MODE_PRIVATE);

		MASTER_PASSWORD = mSharedPreference.getString("master_password", "");
		PUBLIC_PASSWORD = mSharedPreference.getString("public_password", "");
		FUNCTION_MODE = mSharedPreference.getString("function_mode", "");
		PHONE_NUMBER = mSharedPreference.getString("phone_number", "");
	}

	

	
	
	
	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	
	/**
	 * 액티비티를 종료한다
	 *  디바이스의 뒤로가기 버튼으로 인한 종료 / 화면에서의 버튼 조작에 의한 액션 처리 이후 닫을때 호출된다
	 */
	public void deleteTempFileAndFinishActivity(){
		
		// sqlite 에서 삭제
		SendMeDBManagerAudioRecord sendMeDBManagerAudioRecord = new SendMeDBManagerAudioRecord(this);
		if(sendMeDBManagerAudioRecord.deleteTempAudioData(sqliteKey)) {
			// 임시 파일이 있다면 지운다.
			checkAndDeleteTempFile();
			// 화면을 닫는다.
			sendMeActivityManager.removeActivity(SendMeTempMessageListActivity.this);
			finish();
		} else {
			// 실패 알림 토스트
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_TOAST_TEMP_DELETE_FAIL));
		}
		
		// 임시 파일이 있다면 지운다.
		checkAndDeleteTempFile();
		// 화면을 닫는다.
		sendMeActivityManager.removeActivity(SendMeTempMessageListActivity.this);
		finish();
	}

	/**
	 * 파일 전송 후 삭제한다.
	 */
public void deleteTempFile(){
		
		// sqlite 에서 삭제
		SendMeDBManagerAudioRecord sendMeDBManagerAudioRecord = new SendMeDBManagerAudioRecord(this);
		if(sendMeDBManagerAudioRecord.deleteTempAudioData(sqliteKey)) {
			// 임시 파일이 있다면 지운다.
			checkAndDeleteTempFile();
//			// 화면을 닫는다.
//			sendMeActivityManager.removeActivity(SendMeTempMessageListActivity.this);
//			finish();
		} else {
			// 실패 알림 토스트
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_TOAST_TEMP_DELETE_FAIL));
		}
		
//		// 임시 파일이 있다면 지운다.
//		checkAndDeleteTempFile();
//		// 화면을 닫는다.
//		sendMeActivityManager.removeActivity(SendMeTempMessageListActivity.this);
//		finish();
	}
	
	
	
	/**
	 * 임시 파일이 있는지 체크하고 있다면 지운다.
	 */
	public void checkAndDeleteTempFile(){
		
		File file = new File(filePath);
		if(file.exists()){
			file.delete();
		}
	}
	
	/**
	 * 뒤로 가기 버튼을 정의 한다.
	 * 화면을 종료 한다.
	 */
	@Override
	public void onBackPressed() {
		
		if(groupEditMode){
			listViewTempMessageGroupEditLayout.setVisibility(View.GONE);
			groupEditMode = false;
		}else{
			// TODO Auto-generated method stub
			sendMeActivityManager.removeActivity(this);
			finish();
		}
	}
	@Override
	public void onStop(){
		super.onStop();
		dialog.dismiss();
	}


}